//高精度

//两个大整数相加相减
//一个大整数除以一个小整数
  
//大整数 就是把每一位存在数组里面去
//直接在数组上进行加减法就可以了。也就是模拟人工加减法就可以了


//加法                  还有一种方法就是 压位算法 这如果是int就可以压九位（也就是又10进制转换为100000000进制）
// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
    if (A.size() < B.size()) return add(B, A);

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }

    if (t) C.push_back(t);  //注意这儿是push_back(t) 而不是1；
    return C;
}

//减法
// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    for (int i = 0, t = 0; i < A.size(); i ++ )
    {
        t = A[i] - t;
        if (i < B.size()) t -= B[i];
        C.push_back((t + 10) % 10);
        if (t < 0) t = 1;
        else t = 0;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();  //去掉前导0；
    return C;
}

//乘法
//这里的乘法和我们平时的乘法 不一样  以前是一位一位的×  现在我们将B看成一个整体和A的每一位相乘
// C = A * b, A >= 0, b > 0
vector<int> mul(vector<int> &A, int b)
{
    vector<int> C;

    int t = 0;  //表示进位
    for (int i = 0; i < A.size() || t; i ++ )
    {
        if (i < A.size()) t += A[i] * b;  
        C.push_back(t % 10);  //把个位的加进去
        t /= 10;			//把剩下的加上去
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}

//除法

// A / b = C ... r, A >= 0, b > 0
vector<int> div(vector<int> &A, int b, int &r)
{
    vector<int> C;  //商
    r = 0;   //余数
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        r = r * 10 + A[i];  
        C.push_back(r / b);
        r %= b;      //余数
    }
    reverse(C.begin(), C.end());  
    while (C.size() > 1 && C.back() == 0) C.pop_back();  //去掉前导0
    return C;
}

//lowbit操作的介绍
//lowbit的功能就是返回x的最后一位
// lowbit(x) = x&-x  =x& (~x+1)  也就是x与上-x  ，-x也就是x取反加1
   x=10101101000;
  ~x=01010010111;
~x+1=01010011000;
res =00000001000;
////////////------------//////////////

























